﻿#pragma once
#include "stackshap_data.h"


class StackShap
{
public:
	StackShap();
	~StackShap();
	bool IsFixed() { return m_fixed;}
	QString GetName() { return m_name;}
	int GetId() { return m_id;}
	int GetCengNum() { return m_ceng;}
	int GetMaxNum() { return m_max;}

	/****************************************************************************
	 * 功能: 垛形初始化
	 * 传参: info:垛形配置信息
	 * 返回值: 初始化是否成功
	 ****************************************************************************/
	bool Init(const stack::StackCfg& info);

	/****************************************************************************
	 * 功能: 校验物料尺寸和托盘是否适配垛形
	 * 传参: sku: 物料尺寸信息 plate:托盘尺寸信息
	 * 返回值: 适配成功返回最大码垛数量，不匹配返回-1；
	 ****************************************************************************/
	int CheckSkuMatchStack(const ::Size& sku, const ::Size& plate);

	/****************************************************************************
	 * 功能: 获取物料坐标
	 * 传参: index: 抓取序号(1-n)，sku:物料尺寸 pos:输出坐标(z值无效) isOdd: 是否为奇数层
	 * 返回值: 获取是否成功
	 ****************************************************************************/
	bool GetStackPosForSku(int index, const ::Size& sku, stack::SkuPosInfo& pos, bool isOdd);

private:
	bool CheckSkuSizeForShap(const Size& sku, const Size& plate);
	int MathMaxStackNum(int max, int h);
	bool GetShapStackPos(int index, const Size& sku, stack::SkuPosInfo& pos, bool isOdd);

private:
	int m_id = 0;
	QString m_name = "";
	int m_ceng = 0;
	int m_max = -1;
	int m_gap = 0;
	bool m_fixed = false;


	struct ShapInfo {
		double min;
		double max;
		int wx;
		int lx;
		int wy;
		int ly;
	}m_shap = {};
	Size m_skuSize = {};
	stack::EvenType m_evenType = stack::EvenType::even_no;
	QList<stack::SkuPos> m_skuPos;
};
